home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / languags / exdoc.1 < prev    next >
Text File  |  1989-01-10  |  23KB  |  622 lines

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i001:  exdoc - extract docs from C code
  5. Message-ID: <11171@swan.ulowell.edu>
  6. Date: 10 Jan 89 23:18:07 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 611
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: oscvax!jan@uunet.UU.NET (Jan Sven Trabandt)
  12. Posting-number: Volume 89, Issue 1
  13. Archive-name: langauges/exdoc.1
  14.  
  15. [uuencoded binary included.  ..Bob]
  16.  
  17. #    This is a shell archive.
  18. #    Remove everything above and including the cut line.
  19. #    Then run the rest of the file through sh.
  20. #----cut here-----cut here-----cut here-----cut here----#
  21. #!/bin/sh
  22. # shar:    Shell Archiver
  23. #    Run the following text with /bin/sh to create:
  24. #    exdoc.c
  25. #    exdoc.uu
  26. # This archive created: Tue Jan 10 18:15:17 1989
  27. cat << \SHAR_EOF > exdoc.c
  28. /*
  29.  *  exdoc.c V1.0  (C)Copyright 1988, Jan Sven Trabandt. All Rights Reserved.
  30.  *  This software may not be distributed for profit; in other words, it is
  31.  *  freely redistributable except that it may not be incorporated as part of any
  32.  *  commercial software package without my express written consent.
  33.  *  Portions of this code are (C)Copyright 1988, Matthew Dillon.
  34.  *
  35.  *  extract documentation that is in the canonical form from a [.c] file,
  36.  *  putting it to stdout.
  37.  *  it requires about 1K stack to run.
  38.  *  can someone tell me exactly why it isn't pure (1.3 pure bit/resident)???
  39.  *  uucp: {utgpu,utzoo,lsuc}!oscvax!jan
  40.  *
  41.  *  look at this comment as an example;
  42.  *  note that the start of the comment block has 2 characters followed by a '\n'
  43.  *    (the start-C-comment)
  44.  *  and the last line has 3 characters followed by a '\n'
  45.  *    (a space and the end-C-comment)
  46.  *  what comes inbetween these 2 lines can be in any form
  47.  */
  48. #include <stdio.h>
  49. #include <ctype.h>
  50. #ifdef MCH_AMIGA
  51. #include <libraries/dos.h>
  52. #include <libraries/dosextens.h>
  53. #include <functions.h>
  54. #endif MCH_AMIGA
  55.  
  56. #ifndef MCH_AMIGA
  57. #ifndef NODATE
  58. #define NODATE
  59. #endif
  60. #endif !MCH_AMIGA
  61.  
  62. #define VERSION     "1.0"
  63.  
  64. /* flags */
  65. #define IN_COMMENT  ((char)(1 << 0))        /* inside a "valid" comment */
  66. #define REVERSE     ((char)(1 << 1))
  67. #define PRINTIT     ((char)(1 << 7))
  68.  
  69. #define MAX_LINESIZE    514
  70.  
  71. /* flags for copystuff */
  72. #define COPY_DATE   ((char)(1 << 0))
  73. #define COPY_COMM   ((char)(1 << 1))
  74. #define COPY_PROT   ((char)(1 << 2))
  75.  
  76.  
  77. #ifdef MCH_AMIGA
  78. typedef struct FileInfoBlock FIB;
  79. FIB *getFileInfo();
  80.  
  81. extern void *malloc();
  82.  
  83. #ifdef AZTEC_C
  84. #define strcpy    _BUILTIN_strcpy
  85. #define strcmp    _BUILTIN_strcmp
  86. #define strlen    _BUILTIN_strlen
  87. #endif AZTEC_C
  88. #endif MCH_AMIGA
  89.  
  90.  
  91. help( argc, argv )
  92.     int argc;
  93.     char **argv;
  94. {
  95.     fprintf(stderr,
  96.         "Usage: %s [infile] [-o outfile]"
  97. #ifndef NODATE
  98.         " [-cdp]"
  99. #endif !NODATE
  100.         " [-i<n>] [-r] [-qh?]\n"
  101.         "       V%s ... file and flags can appear in any order:\n"
  102.         "    infile     : input file (default: stdin)\n"
  103.         "    -o outfile : output file (default: stdout)\n"
  104. #ifndef NODATE
  105.         "    -c         : copy file comment (must give in/out files)\n"
  106.         "    -d         : copy datestamp (must give infile & outfile)\n"
  107.         "    -p         : copy protection bits (must give in/out files)\n"
  108. #endif !NODATE
  109.         "    -i<n>      : ignore <n> comment blocks\n"
  110.         "    -r         : reverse (everything but comment blocks)\n"
  111.         "                   in this case ignore# is how many to keep\n"
  112.         "    -q         : quiet (suppress warning messages)\n"
  113.         "    -h, -?     : help (this information)\n\n",
  114.         argv[0], VERSION);
  115.     exit( (int) 0 );
  116. } /* help */
  117.  
  118.  
  119. main( argc, argv )
  120.     int argc;
  121.     char **argv;
  122. {
  123.     FILE    *fpin, *fpout;
  124.     char    *infname = NULL, *outfname = NULL;
  125.     char    *temp;
  126.     register short  i;
  127.     short   state = 0;
  128.     char    copystuff = 0, quiet = 0;
  129.     char    s[MAX_LINESIZE];
  130.     register char   flags = 0;
  131.     char    dummy = '\0';
  132.  
  133.     for( i = 1; i < argc; ++i ) {
  134.     temp = argv[i];
  135.     if( *temp++ == '-' ) {                  /* parse flags */
  136.         while( *temp ) {
  137.         switch( tolower(*temp++) ) {
  138.           case 'i':
  139.             /* this way allows while loop to stop properly */
  140.             if( !*temp ) {                  /* if "-i <nnn>" */
  141.             state = atoi( argv[++i] );  /* use next arg */
  142.             } else {
  143.             state = atoi( temp );       /* #comments to skip/keep */
  144.             temp = &dummy;
  145.             }
  146.             break;
  147.           case 'r':
  148.             flags |= REVERSE | PRINTIT;
  149.             break;
  150.           case 'o':
  151.             /* this way allows while loop to stop properly */
  152.             if( !*temp ) {                  /* if "-o outfile" */
  153.             outfname = argv[++i];        /* use next arg */
  154.             } else {
  155.             outfname = temp;        /* outfile name */
  156.             temp = &dummy;
  157.             }
  158.             break;
  159. #ifndef NODATE
  160.           case 'c':
  161.             copystuff |= COPY_COMM;
  162.             break;
  163.           case 'd':
  164.             copystuff |= COPY_DATE;
  165.             break;
  166.           case 'p':
  167.             copystuff |= COPY_PROT;
  168.             break;
  169. #endif !NODATE
  170.           case 'q':
  171.             quiet = 1;
  172.             break;
  173.           case 'h':
  174.           case '?':
  175.             help( argc, argv );
  176.             break;
  177.           default:
  178.             fprintf(stderr, "unknown flag '%c' ignored\n", *(temp - 1));
  179.             break;
  180.         } /* switch */
  181.         } /* while */
  182.     } else {
  183.         if( infname ) {             /* error: too many filenames */
  184.         help( argc, argv );
  185.         } else {
  186.         infname = argv[i];
  187.         }
  188.     }
  189.     } /* for */
  190.  
  191. #ifndef NODATE
  192.     if( !infname || !outfname ) {   /* need both i/o filenames to copy stuff */
  193.     copystuff = 0;
  194.     }
  195. #endif !NODATE
  196.     if( !infname ) {
  197.     fpin = stdin;
  198.     if( !outfname && !quiet ) {
  199.         fprintf(stderr, "%s from stdin to stdout (c-\\ is EOF)\n", argv[0]);
  200.     }
  201.     } else {
  202.     if( !(fpin = fopen(infname, "r")) ) {
  203.         if( !quiet ) {
  204.         fprintf(stderr, "Error, can't open file '%s' for input\n",
  205.                 infname);
  206.         }
  207.         exit( (int) 1000 );
  208.     }
  209.     }
  210.     if( !outfname ) {
  211.     fpout = stdout;
  212.     } else if( !(fpout = fopen(outfname, "w")) ) {
  213.     if( !quiet ) {
  214.         fprintf(stderr, "Error, can't open file '%s' for output\n",
  215.             outfname);
  216.     }
  217.     exit( (int) 1000 );
  218.     }
  219.  
  220.     if( flags & REVERSE ) {
  221.     state = -state;     /* negative #ignore meanse #keep */
  222.     }
  223.     /* print comment block if state is negative
  224.      * state is initialized to the number of comment blocks to skip
  225.      */
  226.     while( fgets(s, MAX_LINESIZE, fpin) ) {
  227.     /* if start of valid comment (and not nested) */
  228.     if( !strcmp(s, "/*\n") && !(flags & IN_COMMENT) ) {
  229.         flags |= IN_COMMENT;
  230.         if( !(flags & REVERSE) ) {  /* if not reverse, ie. state is #skip */
  231.         --state;        /* one less to skip */
  232.         }
  233.         if( state < 0 ) {
  234.         flags |= PRINTIT;
  235.         } else {
  236.         flags &= ~PRINTIT;
  237.         }
  238.     /* if end of valid comment (and we had start of comment) */
  239.     } else if( !strcmp(s, " */\n") && (flags & IN_COMMENT) ) {
  240.         if( state < 0 ) {
  241.         ++state;
  242.         }
  243.         if( flags & PRINTIT ) {
  244.         fprintf(fpout, "%s\n", s);
  245.         }
  246.         if( flags & REVERSE ) {
  247.         flags |= PRINTIT;
  248.         } else {
  249.         flags &= ~PRINTIT;
  250.         }
  251.         flags &= ~IN_COMMENT;
  252.         continue;
  253.     }
  254.  
  255.     if( flags & PRINTIT ) {
  256.         fprintf(fpout, "%s", s);
  257.     }
  258.     } /* while */
  259.  
  260.     if( fpout != stdout ) {
  261.     fclose( fpout );
  262.     }
  263.  
  264. #ifndef NODATE
  265.     if( copystuff ) {               /* need to copy file datestamp/comm/prot */
  266.     FIB    *fib;
  267.     long    lock;
  268.  
  269.     if( !(fib = getFileInfo(infname, &lock)) ) {
  270.         if( !quiet ) {
  271.         fprintf(stderr, "couldn't get file info for input file '%s'\n",
  272.                 infname);
  273.         }
  274.     } else {
  275.         if( copystuff & COPY_DATE ) {
  276.         setfiledate( outfname, &fib->fib_Date );
  277.         }
  278.         if( copystuff & COPY_PROT ) {
  279.         SetProtection( outfname, fib->fib_Protection );
  280.         }
  281.         if( copystuff & COPY_COMM ) {
  282.         SetComment( outfname, fib->fib_Comment );
  283.         }
  284.         freeFileInfo( fib, lock );
  285.     }
  286.     }
  287. #endif !NODATE
  288.  
  289.     if( fpin != stdin ) {
  290.     fclose( fpin );
  291.     }
  292. } /* main */
  293.  
  294.  
  295. #ifdef MCH_AMIGA
  296. #ifndef NODATE
  297. /* The following routines (C)Copyright 1988, Matt Dillon,
  298.  * from his backup program and support library (sup32.lib).
  299.  * Permission was granted to use them in this program.
  300.  */
  301.  
  302. FIB *
  303. getFileInfo(path, plock)
  304. char *path;
  305. long *plock;
  306. {
  307.     register long lock;
  308.     register FIB *fib;
  309.  
  310.     *plock = NULL;
  311.     if (lock = (long) Lock(path, SHARED_LOCK)) {
  312.     if (fib = malloc(sizeof(FIB))) {        /* longword align FIB */
  313.         if (Examine(lock, fib)) {
  314.         *plock = lock;
  315.         return(fib);
  316.         }
  317.         free(fib);
  318.     }
  319.     UnLock(lock);
  320.     }
  321.     return(NULL);
  322. }
  323.  
  324.  
  325. freeFileInfo(fib, lock)
  326. FIB *fib;
  327. long lock;
  328. {
  329.     if (fib)
  330.     free(fib);
  331.     if (lock)
  332.     UnLock(lock);
  333. }
  334.  
  335.  
  336.  
  337. /*
  338.  *  SETFILEDATE.C
  339.  *
  340.  *  BOOL = setfiledate(filename, date)
  341.  */
  342.  
  343. #define BTOC(bptr)    ((long)(bptr) << 2)
  344. #define CTOB(cptr)    ((long)(cptr) >> 2)
  345.  
  346. #ifndef ACTION_SET_DATE
  347. #define ACTION_SET_DATE 34
  348. #endif
  349.  
  350. typedef struct Task          TASK;
  351. typedef struct Process          PROC;
  352. typedef struct StandardPacket STDPKT;
  353. typedef struct MsgPort          MSGPORT;
  354. typedef struct FileLock       LOCK;
  355. typedef struct DateStamp      DATESTAMP;
  356.  
  357.  
  358. extern TASK *FindTask();
  359. extern void *AllocMem();
  360.  
  361. setfiledate(file, date)
  362. char *file;
  363. DATESTAMP *date;
  364. {
  365.     register STDPKT *packet;
  366.     register char   *buf;
  367.     register PROC   *proc;
  368.     long    result;
  369.     long    lock;
  370.  
  371.     {
  372.     register long flock = (long) Lock(file, SHARED_LOCK);
  373.     register short i;
  374.     register char *ptr = file;
  375.  
  376.     if (flock == NULL)
  377.         return(NULL);
  378.     lock = (long) ParentDir(flock);
  379.     UnLock(flock);
  380.     if (!lock)
  381.         return(NULL);
  382.     for (i = strlen(ptr) - 1; i >= 0; --i) {
  383.         if (ptr[i] == '/' || ptr[i] == ':')
  384.         break;
  385.     }
  386.     file += i + 1;
  387.     }
  388.     proc   = (PROC *)FindTask(NULL);
  389.     packet = (STDPKT *)AllocMem((long)sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
  390.     buf = AllocMem((long)strlen(file)+2, MEMF_PUBLIC);
  391.     strcpy(buf+1,file);
  392.     buf[0] = strlen(file);
  393.  
  394.     packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  395.     packet->sp_Pkt.dp_Link = &packet->sp_Msg;
  396.     packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
  397.     packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
  398.     packet->sp_Pkt.dp_Arg1 = NULL;
  399.     packet->sp_Pkt.dp_Arg2 = (long)lock;       /* lock on parent dir of file  */
  400.     packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);  /* BPTR to BSTR of file name   */
  401.     packet->sp_Pkt.dp_Arg4 = (long)date;       /* APTR to datestamp structure */
  402.     PutMsg(((LOCK *)BTOC(lock))->fl_Task, packet);
  403.     WaitPort(&proc->pr_MsgPort);
  404.     GetMsg(&proc->pr_MsgPort);
  405.     result = packet->sp_Pkt.dp_Res1;
  406.     FreeMem(packet, (long)sizeof(STDPKT));
  407.     FreeMem(buf, (long)strlen(file)+2);
  408.     UnLock(lock);
  409.     return(result);
  410. }
  411.  
  412. #endif !NODATE
  413. #endif MCH_AMIGA
  414. SHAR_EOF
  415. cat << \SHAR_EOF > exdoc.uu
  416.  
  417. begin 600 exdoc
  418. M```#\P`````````#``````````(```?2````N`````$```/I```'TD[Z#FI.@
  419. M50``2'H"LR!M``HO$$AZ`!I(;(#X3KH,.$_O`!!"9TZZ&]I43TY=3G55<V%G+
  420. M93H@)7,@6VEN9FEL95T@6RUO(&]U=&9I;&5=(%LM8V1P72!;+6D\;CY=(%LML
  421. M<ET@6RUQ:#]="B`@("`@("!6)7,@+BXN(&9I;&4@86YD(&9L86=S(&-A;B!A!
  422. M<'!E87(@:6X@86YY(&]R9&5R.@H@("`@:6YF:6QE("`@("`Z(&EN<'5T(&9I'
  423. M;&4@*&1E9F%U;'0Z('-T9&EN*0H@("`@+6\@;W5T9FEL92`Z(&]U='!U="!F2
  424. M:6QE("AD969A=6QT.B!S=&1O=70I"B`@("`M8R`@("`@("`@(#H@8V]P>2!FB
  425. M:6QE(&-O;6UE;G0@*&UU<W0@9VEV92!I;B]O=70@9FEL97,I"B`@("`M9"`@>
  426. M("`@("`@(#H@8V]P>2!D871E<W1A;7`@*&UU<W0@9VEV92!I;F9I;&4@)B!O@
  427. M=71F:6QE*0H@("`@+7`@("`@("`@("`Z(&-O<'D@<')O=&5C=&EO;B!B:71S'
  428. M("AM=7-T(&=I=F4@:6XO;W5T(&9I;&5S*0H@("`@+6D\;CX@("`@("`Z(&EGH
  429. M;F]R92`\;CX@8V]M;65N="!B;&]C:W,*("`@("UR("`@("`@("`@.B!R979E"
  430. M<G-E("AE=F5R>71H:6YG(&)U="!C;VUM96YT(&)L;V-K<RD*("`@("`@("`@&
  431. M("`@("`@("`@(&EN('1H:7,@8V%S92!I9VYO<F4C(&ES(&AO=R!M86YY('1OT
  432. M(&ME97`*("`@("UQ("`@("`@("`@.B!Q=6EE="`H<W5P<')E<W,@;7-G(&EFR
  433. M('!I<&EN9R!S=&1I;BT^<W1D;W5T*0H@("`@+6@L("T_("`@("`Z(&AE;'`@Z
  434. M*'1H:7,@:6YF;W)M871I;VXI"@H`,2XP``!.5?W<2.<,`$*M__1"K?_P0FW_7
  435. MZD(M_^E"+?_H>@!"+?WE>`%@``%J,`1(P.6`(&T`"BMP"`#_["!M_^Q2K?_L.
  436. M#!``+68``2(@;?_L2A!G``$6(&W_[%*M_^P0$$B`/P!.N@;T5$](P&```,0@<
  437. M;?_L2A!F'%)$,`1(P.6`(&T`"B\P"`!.N@9&6$\[0/_J8!8O+?_L3KH&-EA/P
  438. M.T#_ZD'M_>4K2/_L8```NHH\`()@``"R(&W_[$H09A121#`$2,#E@"!M``HK+
  439. M<`@`__!@#BMM_^S_\$'M_>4K2/_L8```A`CM``'_Z6!Z".T``/_I8'(([0`"W
  440. M_^E@:AM\``'_Z&!B+RT`"C\M``A.NOPX7$]@4B!M_^P0*/__2(`_`$AZ`M!(W
  441. M;(#X3KH(;$_O``I@-)"\````/V?*D+P````D9Z)3@&>F68!GNE.`9P#_(EV`#
  442. M9P#_8E.`9YI3@&>>4X!G`/],8*Y@`/[D8"9*K?_T9Q`O+0`*/RT`"$ZZ^\I<S
  443. M3V`0,`1(P.6`(&T`"BMP"`#_]%)$N&T`"&T`_I)*K?_T9P9*K?_P9@1"+?_I+
  444. M2JW_]&8L0>R`S"M(__Q*K?_P9AQ*+?_H9A8@;0`*+Q!(>@(_2&R`^$ZZ!\!/(
  445. M[P`,8#)(>@)3+RW_]$ZZ!PQ03RM`__QF'B\M__1(>@(]2&R`^$ZZ!Y9/[P`,"
  446. M/SP#Z$ZZ%S943TJM__!F"D'L@.(K2/_X8#)(>@(Z+RW_\$ZZ!LI03RM`__AF'
  447. M'B\M__!(>@(D2&R`^$ZZ!U1/[P`,/SP#Z$ZZ%O143P@%``%G!$1M_^HO+?_\O
  448. M/SP"`DAM_>9.N@4(3^\`"DJ`9P``O$'M_>9#^@(*$!BP&68$2@!F]I`A2(!F;
  449. M)@@%``!F(`C%```(!0`!9@13;?_J2FW_ZFP&BCP`@&`$RCP`?V!<0>W]YD/ZR
  450. M`=`0&+`99@1*`&;VD"%(@&9$"`4``&<^2FW_ZFP$4FW_ZA`%P#P`@&<42&W]=
  451. MYDAZ`:4O+?_X3KH&I$_O``P(!0`!9P:*/`"`8`3*/`!_"(4``&``_TX0!<`\2
  452. M`(!G%$AM_>9(>@%U+RW_^$ZZ!G!/[P`,8`#_+D'L@.(B;?_XL\AG"B\M__A.5
  453. MNA'>6$]*+?_I9P``B$AM_=PO+?_T3KH!:E!/*T#]X&86+RW_]$AZ`2Y(;(#X]
  454. M3KH&)D_O``Q@7`@M``#_Z6<2(&W]X$AH`(0O+?_P3KH!OE!/""T``O_I9Q(@7
  455. M;?W@+R@`="\M__!.NA?04$\(+0`!_^EG$B!M_>!(:`"0+RW_\$ZZ%ZA03R\M\
  456. M_=PO+?W@3KH!5%!/0>R`S")M__RSR&<*+RW__$ZZ$3I83TS?`#!.74YU=6YKE
  457. M;F]W;B!F;&%G("<E8R<@:6=N;W)E9`H`)7,@9G)O;2!S=&1I;B!T;R!S=&1O/
  458. M=70@*&,M7"!I<R!%3T8I"@!R`$5R<F]R+"!C86XG="!O<&5N(&9I;&4@)R5S,
  459. M)R!F;W(@:6YP=70*`'<`17)R;W(L(&-A;B=T(&]P96X@9FEL92`G)7,G(&9O/
  460. M<B!O=71P=70*`"\J"@`@*B\*`"5S"@`E<P!C;W5L9&XG="!G970@9FEL92!IV
  461. M;F9O(&9O<B!I;G!U="!F:6QE("<E<R<*`$Y5``!(YP@@(&T`#$*02'C__B\M(
  462. M``A.NA9`4$\H`&<^/SP!!$ZZ$J943R1`2H!G)B\*+P1.NA7T4$]*0&<0(&T`:
  463. M#""$(`I,WP003EU.=2\*3KH2CEA/+P1.NA9J6$]P`&#D3E4``$JM``AG"B\M4
  464. M``A.NA)N6$]*K0`,9PHO+0`,3KH60EA/3EU.=4Y5__A(YP\P2'C__B\M``A._
  465. MNA6\4$\J`"XM``A*A68*<`!,WPSP3EU.=2\%3KH5R%A/*T#_^"\%3KH6`%A/6
  466. M2JW_^&8$<`!@VB!'(`A*&&;\D<!3B#P(4T9@%B!'##``+V``9Q`@1PPP`#I@Z
  467. M`&<&4T9*1FSF,`920$C`T:T`"$*G3KH6$%A/*`!(>0`!``%(>`!$3KH5[%!/3
  468. M)$!(>``!(&T`""`(2AAF_)'`4X@P"$C`5(`O`$ZZ%<I03R9`($M2B")M``@0M
  469. MV6;\(&T`""`(2AAF_)'`4X@P"!:`($K1_````!0E2``*)4H`%"!$T?P```!<(
  470. M)4@`&"5\````(@`<0JH`*"5M__@`+"`+Y(`E0``P)6T`#``T+PH@+?_XY8`@E
  471. M0"\H``Q.NA6X4$\@1$AH`%Q.NA746$\@1$AH`%Q.NA6`6$\K:@`@__Q(>`!$'
  472. M+PI.NA5:4$\@;0`((`A*&&;\D<!3B#`(2,!4@"\`+PM.NA4\4$\O+?_X3KH4@
  473. MPEA/("W__&``_J!.50``2.<,("1M``@,$@`@9P8,$@`)9@12BF#P>@`,$@`MS
  474. M9@9Z`5**8`@,$@`K9@)2BG@`8!8@2E**$!!(@#($POP`"M!!.`"8?``P$!)()
  475. M@%)`0>R`2@@P``(``&;82D5G!C`$1$!@`C`$3-\$,$Y=3G5P`!`O``6P/`!@8
  476. M8PJP/`!Z8@20/``@3G5P`!`O``6P/`!`8PJP/`!:8@30/``@3G5.50``2.<(J
  477. M("1M``A3;0`,2FT`#&\@+RT`#DZZ`#@X`+!\__]83V<.($I2BA"$N'P`"F<"`
  478. M8-9"$KA\__]F$+7M``AF"G``3-\$$$Y=3G4@+0`(8/).50``2.<(("1M``@O2
  479. M"DZZ`#(X`+!\__]83V<B,`1(P&`44Y((Z@`#``QP_TS?!!!.74YU8-9*@&?ZI
  480. M68!GY#`$8.I.50``+PHD;0`((%*QZ@`$90PO"F$66$\D7TY=3G4@4E*2$!!(?
  481. M@,!\`/]@[$Y5``!(YP@P)&T`"!`J``S`/``89PIP_TS?#!!.74YU"*H``@`,9
  482. M2JH`"&8(+PI.N@Y:6$\0*@`,2(`(```'9S!![(#,)D@0*P`,2(#`?`"$L'P`0
  483. MA&8,/SS__R\+3KH-$EQ/U_P````60>R"A+?(9=8_*@`0+RH`"!`J``U(@#\`Y
  484. M3KH"=C@`2D!03VX42D1F!'`(8`)P$($J``QP_V``_WHP!$C`)*H`"-"J``@EM
  485. M0``$(%)2DA`02(#`?`#_8`#_6DY5```O"DZZ#8HD0$J`9@AP`"1?3EU.=2\*G
  486. M+RT`#"\M``AA!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ"_1![(`")$A83TH29A`Y_
  487. M?``%@I9P`$S?!!!.74YU($HB;0`,$!BP&68$2@!F]I`A2(!G!%R*8-(_*@`$E
  488. M+RT`"$ZZ`'@X`+!\__]<3V8$<`!@Q"!M`!`11``-(&T`$!%\``$`#"`M`!!@B
  489. MK$Y5```I;0`(@HY(;0`0+RT`#$AZ``Y.N@<(3^\`#$Y=3G5.50``+RR"CC\M#
  490. M``A.N@JT7$].74YU3E4``#\M``P_/`,!+RT`"&$&4$].74YU3E4``$CG#S`D.
  491. M;0`(3KH.]"9L@IAX`&`.,`3!_``&2K,(`&<.4D2X;(*$;>QZ!F```,0(+0`!U
  492. M``QG,$AX__\O"DZZ$/8L`%!/9R`O!DZZ$58O"DZZ$*9*@%!/9@Y.NA#".@"PV
  493. M?`#-9@``C$AX`^TO"DZZ$-0L`$J&4$]F8`@M````#&8$>@%@;$AX`^XO"DZZ5
  494. M$+8L`%!/9@A.NA"&.@!@5$AX`"%(>@"23KH1BBX`4$]G"B\'3KH1)%A/8!Y(!
  495. M>``!2'H`@B\&3KH0Z$AX__]"IR\&3KH0HD_O`!A@)C`M``S`?`4`L'P%`&88]
  496. M+P9.N@_T>@183SE%@I9P_TS?#/!.74YU,`3!_``&)X8(`#`$P?P`!B!`T<LQ/
  497. M;0`,``0(+0`#``QG$$AX``%"IR\&3KH02$_O``PP!&#"9&]S+FQI8G)A<GD``
  498. M``!.50``2.<,(#@M``A.N@VN,`3!_``&)$#5[(*82D1M"KAL@H1L!$J29A`Y.
  499. M?``"@I9P_TS?!#!.74YU,"H`!,!\``.P?``!9@HY?``%@I9P_V#@<``P+0`.H
  500. M+P`O+0`*+Q).N@_`*@"PO/____]/[P`,9@Q.N@]F.4""EG#_8+0@!6"P87!#5
  501. M[(*.1>R"CK7)9@XR/``4:PAT`"+"4<G__"E/@IPL>``$*4Z"H$CG@(`(+@`$1
  502. M`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`@3J[^:"E`@J1F#"X\``.`!TZN_Y1@0
  503. M!$ZZ`!I03TYU9&]S+FQI8G)A<GD`2?D``'_^3G5.50``+PI(>0`!```P+(*$S
  504. MP?P`!B\`3KH/D"E`@IA03V840J=(>0`!``!.N@]04$\N;(*<3G4@;(*80F@`Q
  505. M!"!L@I@Q?``!`!`@;(*8,7P``0`*(&R"G"`L@IR0J``$4(`I0(*H(&R"J""\+
  506. M34%.6$*G3KH/2"1`2JH`K%A/9RXO+0`,+RT`""\*3KH`KCE\``&"K"!L@I@`!
  507. M:(````0@;(*8`&B````*3^\`#&!"2&H`7$ZZ#WQ(:@!<3KH/+"E`@JX@;(*NW
  508. M2J@`)%!/9Q`@;(*N(F@`)"\13KH-U%A/+RR"KB\*3KH":"EL@JZ"LE!/3KH-)
  509. MYB!L@I@@@$ZZ#A@@;(*8(4``!F<62'@#[4AZ`"I.N@WT(&R"F"%```Q03R\L6
  510. M@K(_+(*V3KKRMD)G3KH+[E!/)%].74YU*@!.50``2.<,,"1M`!`@;0`(2J@`A
  511. MK&<8(&T`""`H`*SE@"@`($0@*``0Y8`F0&`$)FR"AA`32(!(P-"M``Q4@#E`/
  512. M@KA"IS`L@KA(P"\`3KH.(BE`@KI03V8(3-\,,$Y=3G40$TB`.@`_!2!+4H@O,
  513. M""\L@KI.N@%^,`5(P"!`T>R"ND/Z`400V6;\/RT`#B\*+RR"NDZZ`3H@;(*Z>
  514. M0C!0`#E\``&"MC`%2,#0K(*Z)D!2BR1+3^\`%!`32(`Z`+!\`"!G&+I\``EG_
  515. M$KI\``QG#+I\``UG!KI\``IF!%*+8-@,$P`@;7H,$P`B9BY2BR!+4HL0$$B`^
  516. M.@!G'B!*4HH0A;I\`")F$`P3`")F!%*+8`9"*O__8`)@UF`X($M2BQ`02(`Z:
  517. M`&<FNGP`(&<@NGP`"6<:NGP`#&<4NGP`#6<.NGP`"F<(($I2BA"%8,X@2E**=
  518. M0A!*168"4XM2;(*V8`#_6D(20J<P+(*V4D!(P.6`+P!.N@T`*4""LE!/9@A"6
  519. M;(*V8`#^V'H`)FR"NF`D,`5(P.6`(&R"LB&+"``@2R`(2AAF_)'`4X@P"%)`)
  520. M2,#7P%)%NFR"MFW6,`5(P.6`(&R"LD*P"`!@`/Z4(``P/'__8`0P+P`,(&\`-
  521. M!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$3G5,[P,```0@"#(O``Q@`A#9%
  522. M5\G__&<&4D%@`D(84<G__$YU3E4``$CG#C`D;0`(0J=(>@".3KH,DBE`@KY0P
  523. M3V8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@S4*`!83V=22'H`;2!$+R@`-DZZ-
  524. M#*8F0$J`4$]G-$AX`^TO"TZZ"UXL`%!/9R0@!N6`*@`@125H``@`I"5&`)Q(O
  525. M>`/M2'H`.$ZZ"SHE0`"@4$\O!$ZZ#')83R\L@KY.N@NT0JR"OEA/8(!I8V]NS
  526. M+FQI8G)A<GD`5TE.1$]7`"H`3E4``$CG""`D;0`.#&T`!``29@@@;0`(*!!@H
  527. M'$IM``QO#"!M``AP`#`0*`!@"B!M``@P$$C`*`!";0`22FT`#&P01&T`#$J$!
  528. M;`A$A#M\``$`$C(M``Q(P2`$3KH#D$'L@#A3BA2P```R+0`,2,$@!$ZZ`X8H0
  529. M`&;:2FT`$F<&4XH4O``M(`I,WP003EU.=4Y5_R)(YP@P)&T`""9M``Q";?_ZR
  530. M*VT`$/_\($M2BQ`02(`X`&<``NZX?``E9@`"S$(M_S`[?``!__@[?``@__8[#
  531. M?"<0__0@2U*+$!!(@#@`L'P`+68.0FW_^"!+4HL0$$B`.`"X?``P9A`[?``PJ
  532. M__8@2U*+$!!(@#@`N'P`*F88(&W__%2M__P[4/_R($M2BQ`02(`X`&`R0FW_A
  533. M\F`<,"W_\L'\``K01)!\`#`[0/_R($M2BQ`02(`X`#`$4D!![(!*"#```@``>
  534. M9M2X?``N9EH@2U*+$!!(@#@`L'P`*F88(&W__%2M__P[4/_T($M2BQ`02(`X"
  535. M`&`R0FW_]&`<,"W_],'\``K01)!\`#`[0/_T($M2BQ`02(`X`#`$4D!![(!*J
  536. M"#```@``9M0[?``"__"X?`!L9A(@2U*+$!!(@#@`.WP`!/_P8!"X?`!H9@H@B
  537. M2U*+$!!(@#@`,`1(P&!Z.WP`"/_N8!8[?``*_^Y@#CM\`!#_[F`&.WS_]O_N/
  538. M/RW_\$AM_S`_+?_N+RW__$ZZ_>0K0/_J,"W_\$C`T:W__$_O``Q@7"!M__Q8?
  539. MK?_\(E`K2?_J(`E*&6;\D\!3B3M)__!@2B!M__Q4K?_\.!!![?\O*TC_ZA"$)
  540. M8"B0O````&-GXE.`9Y*0O`````MG`/]R68!GLE6`9P#_<%>`9P#_<F#,0>W_@
  541. M,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_\$IM__AG:"!M_^H,$``M9PH@;?_J'
  542. M#!``*V8N#&T`,/_V9B93;?_R(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8*</],3
  543. MWPP03EU.=6`6/RW_]DZ2L'S__U1/9@1P_V#D4FW_^C`M__)3;?_RL&W_\&[<7
  544. M0FW_[F`@(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8$</]@L%)M_^X@;?_J2A!G:
  545. M"C`M_^ZP;?_T;<XP+?_NT6W_^DIM__AF*&`8/SP`($Z2L'S__U1/9@9P_V``7
  546. M_WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$3I*P?/__5$]F!G#_8`#_4E)M__I@,
  547. M`/T(,"W_^F``_T)(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S??
  548. M`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O_
  549. M`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!0
  550. M3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.A
  551. M50``+P0X+0`(+RT`"C\$3KH`,+A\``I<3V8D(&T`"A`H``Q(@`@```=G%#\\Q
  552. M__\O+0`*3KH`]%Q/*!].74YU8/A.50``+PHD;0`*(%*QZ@`$91@P+0`(P'P`^
  553. M_S\`+PI.N@#(7$\D7TY=3G4@4E*2$"T`"1"`2(#`?`#_8.A.50``+PI![(#,O
  554. M)$@@2M7\````%B\(81!83T'L@H2UR&7J)%].74YU3E4``$CG""`D;0`(>``@G
  555. M"F8*</],WP003EU.=4HJ``QG4`@J``(`#&<,/SS__R\*85(X`%Q/$"H`#4B`7
  556. M/P!.N@4<B$`(*@`!``Q43V<*+RH`"$ZZ`BY83P@J``4`#&<2+RH`$DZZ`L`OC
  557. M*@`23KH"%%!/0I)"J@`$0JH`"$(J``PP!&"03E7__DCG""`D;0`(0?K_1BE(.
  558. M@L((*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,"!2D>H`"#@(/P0O*@`($"H`]
  559. M#4B`/P!.N@*`L$103V<0".H`!``,0I)"J@`$</]@P`QM__\`#&80"*H``@`,V
  560. M0I)"J@`$<`!@J$JJ``AF""\*3KH`FEA/#&H``0`09BH;;0`-__\_/``!2&W_"
  561. M_Q`J``U(@#\`3KH"(K!\``%03V:@,"T`#&``_VHDJ@`(,"H`$$C`T*H`""5`L
  562. M``0(Z@`"``P@4E*2$"T`#1"`2(#`?`#_8`#_/DY5```O"D'L@,PD2$HJ``QG\
  563. M&-7\````%D'L@H2UR&4(<``D7TY=3G5@XD*20JH`!$*J``@@"F#J3E7__"\*"
  564. M)&T`"#\\!`!.N@#`*T#__%1/9A@U?``!`!`@2M'\````#B5(``@D7TY=3G4U)
  565. M?`0``!`(Z@`!``PE;?_\``@0*@`-2(`_`$ZZ`.)*0%1/9P8`*@"```Q@SDY5]
  566. M``!(YP`P)&R"DF`4)E(@*@`$4(`O`"\*3KH$PE!/)$L@"F;H0JR"DDS?#`!.0
  567. M74YU3E4``"\*0?K_QBE(@L9"IR`M``A0@"\`3KH$:"1`2H!03V8(<``D7TY=_
  568. M3G4DK(*2)6T`"``$*4J"DB`*4(!@YDY5``!P`#`M``@O`&&R6$].74YU3E4`^
  569. M`$CG`#"7RR1L@I)@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$#
  570. M)I)@!"E2@I(@*@`$4(`O`"\*3KH$%'``4$]@V$Y5```O"C`M``C!_``&)$#55
  571. M[(*82FT`"&T.,"T`"+!L@H1L!$J29@XY?``"@I9P_R1?3EU.=3`M``C!_``&>
  572. M(&R"F"\P"`!.N@+82H!83V<$<`%@`G``8-A.50``+RT`"$ZZ`I!*@%A/9@Y.:
  573. MN@*L.4""EG#_3EU.=7``8/A.50``2.<,(#@M``A.N@!P,`3!_``&)$#5[(*8W
  574. M2D1M"KAL@H1L!$J29A`Y?``"@I9P_TS?!#!.74YU,"H`!,!\``-F"CE\``6"%
  575. MEG#_8.1P`#`M``XO`"\M``HO$DZZ`LXJ`+"\_____T_O``QF#$ZZ`BPY0(*6G
  576. M</]@N"`%8+1.5?_\2'@0`$*G3KH#4"M`__P(```,4$]G$DIL@JQF""`M__Q.L
  577. M74YU3KH`!G``8/1.50``2'@`!$AZ`!Q.N@(4+P!.N@)J/SP``4ZZ``Y/[P`.6
  578. M3EU.=5Y#"@!.50``2JR"PF<&(&R"PDZ0/RT`"$ZZ``A43TY=3G5.5?_\+P0PG
  579. M+0`(2,`K0/_\2JR"F&<H>`!@"C\$3KH`_E1/4D2X;(*$;?`P+(*$P?P`!B\`!
  580. M+RR"F$ZZ`F!03TJL@L9G!B!L@L9.D$JL@HIG"B\L@HI.N@'06$]*K(+*9P@@&
  581. M;(+*(*R"SDJL@M)G"B\L@M).N@'L6$]*K(+69PHO+(+63KH!W%A/2JR"VF<*;
  582. M+RR"VDZZ`<Q83TJL@MYG"B\L@MY.N@&\6$\L>``$""X`!`$I9Q0O#4OZ``I.!
  583. MKO_B*E]@!D*G\U].<TJL@JYF,$JL@KIG*#`L@KA(P"\`+RR"NDZZ`;@P+(*VP
  584. M4D!(P.6`+P`O+(*R3KH!I$_O`!!@#DZZ`8XO+(*N3KH!T%A/("W__"YL@IQ.6
  585. M=2@?3EU.=4Y5``!(YPX@."T`"#`$P?P`!B1`U>R"F$I$;0JX;(*$;`1*DF80^
  586. M.7P``H*6</],WP1P3EU.=0@J``<`!&8(+Q).N@`*6$]"DG``8.(B+P`$+&R"E
  587. MI$[N_]PB+P`$+&R"I$[N_X(B+P`$+&R"I$[N_[A.^@`"3.\`!@`$+&R"I$[N:
  588. M_YHL;(*D3N[_RBQL@J1.[O]\(B\`!"QL@J1.[O\H3OH``DSO``8`!"QL@J1.B
  589. M[O^L3.\`!@`$+&R"I$[N_^(L;(*D3N[_Q"(O``0L;(*D3N[_+DSO``X`!"QL7
  590. M@J1.[O_63.\`#@`$+&R"I$[N_[Y,[P`&``0L;(*D3N[_3$SO``8`!"QL@J1.6
  591. M[O]&3OH``B(O``0L;(*D3N[_IDSO``X`!"QL@J1.[O_02.<!!$SO((``#"QLZ
  592. M@J!.KO^43-\@@$YU3OH``B)O``0L;(*@3N[^8D[Z``),[P`#``0L;(*@3N[_U
  593. M.D[Z``(B;P`$+&R"H$[N_MHL;(*@3N[_?$[Z``(B;P`$("\`""QL@J!.[O\NQ
  594. M3OH``B!O``0L;(*@3N[^C"QL@J`B;P`$("\`"$[N_=A,[P,```0L;(*@3N[^*
  595. MDB)O``0L;(*@3N[^ADSO``,`!"QL@J!.[O[.3OH``B!O``0L;(*@3N[^@$SOQ
  596. M`P``!"QL@KY.[O^@(&\`!"QL@KY.[O^F(&\`!"QL@KY.[O^R``````/L````-
  597. M`0````$```[@`````````_(```/J````HW(``````'(K`````G<````#`7<KC
  598. M```#`F$````)`6$K```)`G@````%`7@K```%`@```````#`Q,C,T-38W.#EA=
  599. M8F-D968````@("`@("`@("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`4
  600. M0$!`0$!`0$!`0$`,#`P,#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!Y
  601. M`0$!`0$!`0$!0$!`0$!`"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`M
  602. M(``````````````````!``````$``````````````````````0$````!````E
  603. M``````````````````$"`````0``````````````````````````````````$
  604. M`````````````````````````````````````````````````````````````
  605. M`````````````````````````````````````````````````````````````
  606. M`````````````````````````````````````````````````````````````
  607. M`````````````````````````````````````````````````````````````
  608. M`````````````````````````````````````````````````````````````
  609. M`````````````````````````````````````````````````````````````
  610. M`````````````````````````````````````````````````````````````
  611. M```````````````````````````````````````````````````4````````4
  612. 2``````/R```#ZP````$```/R9
  613. ``
  614. end
  615. size 8748
  616. SHAR_EOF
  617. #    End of shell archive
  618. exit 0
  619. -- 
  620. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  621. Have five nice days.
  622.